﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace LocalElectrodomesticos.Controllers
{
    public class LocalController : Controller
    {
        //
        // GET: /Local/
        public Comparador comp = new Comparador();
        public static List<Producto> productos = new List<Producto>();
        public static List<ProductoComprado> carrito = new List<ProductoComprado>();

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Cargar()
        {
            if (productos.Count == 0)
            {
                Producto prod0 = new Producto(nombre: "horno", marca: "Volcan", precio: 1000, categoria: (Categoria)0);
                Producto prod1 = new Producto(nombre: "Microondas", marca: "philips", precio: 500, categoria: (Categoria)0);
                Producto prod2 = new Producto(nombre: "Notebook", marca: "Banghoo", precio: 5000, categoria: (Categoria)1);
                Producto prod3 = new Producto(nombre: "Notebook", marca: "Asus", precio: 6000, categoria: (Categoria)1);
                Producto prod4 = new Producto(nombre: "Aire Acondicionado", marca: "Dream", precio: 7000, categoria: (Categoria)2);
                Producto prod5 = new Producto(nombre: "Estufa", marca: "Philips", precio: 700, categoria: (Categoria)2);
                Producto prod6 = new Producto(nombre: "Parlantes Poteciados", marca: "Pioner", precio: 10000, categoria: (Categoria)3);
                Producto prod7 = new Producto(nombre: "Cable plug", marca: "Pioner", precio: 100, categoria: (Categoria)3);

                productos.Add(prod0);
                productos.Add(prod1);
                productos.Add(prod2);
                productos.Add(prod3);
                productos.Add(prod4);
                productos.Add(prod5);
                productos.Add(prod6);
                productos.Add(prod7);
            }
       
            return RedirectToAction("Index", "Local");
        }

        public ActionResult Borrar(Int16 pos)
        {
            productos.RemoveAt(pos);
            return RedirectToAction("Administrar");
        }

        public ActionResult Administrar()
        {
            return View(model: productos);
        }

        [HttpGet]
        public ActionResult Listar()
        {
            ViewBag.Categoria = 999;
            return View(model: productos);
        }

        [HttpPost]
        public ActionResult Listar(Int16 filtro)
        {
            ViewBag.Categoria = filtro;
            return View(model: productos);
        }
        [HttpGet]
        public ActionResult Modificar(Int16 pos)
        {
            var m = productos[pos];
            ViewBag.pos = pos;
            return View(m);
        }

        [HttpPost]
        public ActionResult Modificar(String nombre, String marca, Int32 precio, Int16 pos, Categoria categoria)
        {
            var m = productos[pos];
            m.nombre = nombre;
            m.marca = marca;
            m.precio = precio;
            m.categoria = categoria;
            return RedirectToAction("Administrar");
        }

        public ActionResult Agregar(String nombre, String marca, Int32 precio, Categoria categoria)
        {
            Producto m = new Producto(nombre, marca, precio, categoria);
            productos.Add(m);
            productos.Sort(comp);
            return RedirectToAction("Administrar");
        }

        public ActionResult Carrito()
        {
            return View(model: carrito);
        }

        public ActionResult AgregarCarrito(Int16 pos)
        {
            ProductoComprado m = new ProductoComprado(productos[pos].nombre, productos[pos].marca, productos[pos].precio, productos[pos].categoria, 1);
            CompararProductos compare = new CompararProductos();
            int i = carrito.BinarySearch(m, compare);
            if(i != 0)
                carrito.Add(m);
            return RedirectToAction("Listar");
        }

        public ActionResult BorrarCarrito(Int16 pos)
        {
            carrito.RemoveAt(pos);
            return RedirectToAction("Carrito");
        }

        public ActionResult Actualizar(Int16 pos, Int32 cantidad)
        {
            carrito[pos].cantidad = cantidad;
            return RedirectToAction("Carrito");
        }

        public ActionResult Comprar()
        {
            return View(model: carrito);
        }

    }



    public enum Categoria
    {
        Cocina, Informatica, Climatizacion, Audio
    }

    public class Producto
    {
        public String nombre { get; set; }
        public String marca { get; set; }
        public Int32 precio { get; set; }
        public Categoria categoria { get; set; }

        public Producto(String nombre, String marca, Int32 precio, Categoria categoria)
        {
            this.nombre = nombre;
            this.marca = marca;
            this.precio = precio;
            this.categoria = categoria;
        }

    }

    public class ProductoComprado
    {
        public String nombre { get; set; }
        public String marca { get; set; }
        public Int32 precio { get; set; }
        public Categoria categoria { get; set; }
        public Int32 cantidad{ get; set; } 

        public ProductoComprado(String nombre, String marca, Int32 precio, Categoria categoria, Int32 cantidad)
        {
            this.nombre = nombre;
            this.marca = marca;
            this.precio = precio;
            this.categoria = categoria;
            this.cantidad = cantidad;
        }


    }

    public class Comparador : IComparer<Producto>
    {

        #region IComparer<Producto> Members

        public int Compare(Producto x, Producto y)
        {
            return x.categoria.CompareTo(y.categoria);
        }

        #endregion
    }

    class CompararProductos : IComparer<ProductoComprado>
    {
        #region IComparer<ProductoComprado> Members

        public int Compare(ProductoComprado x, ProductoComprado y)
        {
            int res = x.nombre.CompareTo(y.nombre)+y.marca.CompareTo(y.marca);
            return res;
        }

        #endregion
    }
}
